#ifndef __RESPOND_STRUCT_DEFINE
#define __RESPOND_STRUCT_DEFINE

#include "protocal_define.h"
#include "system_parameters.h"

#define HEAD 0xea90
#define TAIL 0Xfaf3

#pragma pack(1)

typedef struct {

    uint16_t checksum; // 校验和
    uint16_t tail;     // 0xfaf3 传输报文包尾
} packet_tail_t;

// 心跳指令响应报文格式
typedef struct {
    uint16_t head;
    uint8_t cmd;       // 指令标识
    uint16_t checksum; // 校验和
    uint16_t tail;
} rspheartbeat_t;

// 无人机状态获取响应报文格式1
typedef struct {
    uint16_t head;
    uint8_t cmd;                // 指令标识
    uint8_t uavstatus;          // 飞行状态
    float uavvoltage;           // 电池电压
    float uavbattery;           // 电池剩余电量
    uint16_t uavremainder;      // 电池剩余飞行时间
    int32_t uavlongitude;       // 位置经度
    int32_t uavlatitude;        // 位置纬度
    int32_t uavheight;          // 位置对地高度
    int32_t uavaltitude;        // 位置海拔高度
    float uavdirection;         // 机头方向
    float uavspeed;             // 飞行速度
    float uavattitudeangle;     // 姿态角
    float uavazimuth;           // 航向
    uint16_t uavwaypointnumber; // 航点序号
    float uavwaypointlongitude; // 航点经度
    float uavwaypointlatitude;  // 航点纬度
    float uavwaypointheight;    // 航点对地高度
    uint8_t uavhealthyinfo;     // 健康管理信息
    uint8_t uavwarninginfo;     // 告警信息
    uint8_t reserved[18];       // 保留字节
    uint16_t checksum;          // 校验和
    uint16_t tail;
} rspuavstatus1_t;

/*
无人机状态获取响应报文格式2
载荷状态获取响应报文格式2
飞控参数设置响应报文格式
载荷参数设置响应报文格式
靶标加载模拟数据响应报文格式
无人机飞控响应报文格式
载荷控制指令响应报文格式
定位数据传输响应报文格式2
定位数据传输响应报文格式3
信号表数据获取响应报文格式2
靶机定位指令响应报文格式2
靶机定位指令响应报文格式2
远程启停控制指令响应报文格式

以上均使用通用相应格式
*/

typedef struct {
    uint16_t head;      // 0xea90	传输报文包头
    uint8_t cmd;        // 指令标识
    uint8_t cmdrespond; // 指令回复
    uint16_t checksum;  // 校验和
    uint16_t tail;      // 0xfaf3	传输报文包尾
} rspuniversal_t;

// IQ信息传输响应报文格式
typedef struct {
    uint16_t head;             // 0xea90	传输报文包头
    uint8_t cmd;               // 0x99-表示IQ信息数据
    uint8_t signalid;          // 信号表信号序号 返回的信号在信号表里的序号
    uint16_t packet_total_num; // 总包数
    uint8_t sensenodeip;
    float sampleFrequency; // 信号采样率MHz
    uint64_t arriveTime;   // 信号到达时间us
    uint64_t endtime;      // 信号结束实际us
    uint32_t frequency;    // 信号频率KHz
    uint16_t bandwidth;    // 信号带宽KHz
    int32_t latitude;      // 信号经度(°)
    int32_t longitude;     // 信号纬度(°)
    int32_t height;        // 信号高度(m)
    float speed;           // 信号速度(km/h)
    float angle;           // 信号航向角(°)
    uint16_t checksum;     // 校验和
    uint16_t tail;         // 0xfaf3 传输报文包尾
} iq_information_t;

// IQ数据块传输响应报文格式
typedef struct {
    uint16_t head;           // 0xea90	传输报文包头
    uint8_t cmd;             // 0x9A-表示IQ数据块
    uint16_t bulk_seq;       // 当前包序号
    uint16_t iq_packet_size; // 此包IQ数据大小
} iq_bulk_t;

typedef struct {
    uint16_t id;
    uint64_t arrivetime; // 信号到达时间us
    uint64_t endtime;    // 信号结束实际us
    uint32_t frequency;  // 信号频率kHz
    uint16_t bandwidth;  // 信号带宽kHz
    int32_t longitude;   // 信号经度(°)/1e7
    int32_t latitude;    // 信号纬度(°)/1e7
    int32_t height;      // 信号高度(mm)
    float speed;         // 信号速度(km/h)
    float angle;         // 信号航向角
    uint32_t IQ_size;
    IQstruct_t *IQ_table;
} signaltable_t; // 数据卸载部分信号表

// 信号表数据获取响应报文格式1
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;   // 0x11-表示信号表数据传输指令
    uint16_t N;    // 新信号数量 最新一次询问发现的有效信号数为N

    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} rspgetsignaltable1_t;

// 靶机定位指令响应报文格式1
typedef struct {
    uint16_t head;               // 0xea90	传输报文包头
    uint8_t cmd;                 // 0xbb
    uint64_t positiontime;       // 定位时间
    uint8_t targetnumbers;       // 靶机数量
    uint8_t targetnumber[6];     // 靶机编号
    double positionlongitude[6]; // 定位经度
    double positionlatitide[6];  // 定位纬度
    double positionheight[6];    // 定位高度
    uint16_t checksum;           // 校验和
    uint16_t tail;               // 0xfaf3	传输报文包尾
} rsptargetposition1_t;

// 数据卸载指令响应报文格式
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;   // 0xaa
    uint8_t
        datatype; // b0:
                  // 0-表示信号表数据，1-表示中频IQ数据（返回值与数据卸载指令b4~b7相关）b1~b7:备份
    uint32_t
        datasize; // 单位-字节byte，表示当前请求的数据总大小。说明：如果数据卸载指令b4~b7=0，此处返回0；
                  // 如果数据卸载指令b4~b7=1读取信号表，此处返回信号表总大小；如果数据卸载指令b4~b7=2，
                  // 即卸载指定信号对应的中频数据，此处返回当前正在传输的信号中频数据总大小。
    float
        rate; // 传输进度百分比%，说明：如果数据卸载指令b4~b7=2，传输进度为指定信号的中频传输进度，每个指定信号的中频进度均是0-100%变化
    uint8_t reserved[2];
    uint16_t length; // M表示传输数据包的个数，可以是IQ数据包或信号表数据包
    // uint16_t data; // iq或者信号表数据包
    // 指定信号N描述	TBD	6*(N-1)	　	N表示设置指定信号数量
    uint16_t checksum; // 校验和
    uint16_t tail;     // 0xfaf3	传输报文包尾
} rspdataremove_t;

static inline int checksum_gen(uint8_t *buffer, int len) {
    int checksum = 0;
    for (int i = 0; i < len; i++) {
        checksum += buffer[i];
    }
    return checksum;
}

#pragma pack()
#endif
